package efu.nf.seckilldemo.common.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.CustomExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * @author lwj
 * @create 2025-09-29-9:44
 */
@Configuration
public class RabbitmqConfig {
    /**
     * 延迟交换机
     */
    public static final String EXCHANGE_NAME = "delay.exchange";
    /**
     * 延迟队列
     */
    public static final String QUEUE_KEY = "delay.queue";
    /**
     * 路由键
     */
    public static final String ROUTING_KEY = "delay.key";
    /**
     * 延迟时间
     */
    public static final Long DELAY_TIME = 30000L;

    /**
     * 自定义延迟交换机
     * @return
     */
    @Bean
    public CustomExchange exchange() {
        Map<String,Object> params = new HashMap<>();
        // 指定延迟交换机类型
        params.put("x-delayed-type", "direct");
        /**
         * CustomExchange 参数含义：
         * 1. 交换机名称
         * 2. 交换机类型
         * 3. 是否持久化
         * 4. 是否自动删除
         */
        return new CustomExchange(EXCHANGE_NAME, "x-delayed-message", false, false, params);
    }

    /**
     * 装配Queue
     * @return
     */
    @Bean
    public Queue queue(){
        /**
         * Queue 构造参数含义：
         * 1. 队列名称
         * 2. 是否持久化
         */
        return new Queue(QUEUE_KEY, false);
    }

    /**
     * 绑定队列和交换机
     * @return
     */
    @Bean
    public Binding binding(){
        /**
         * Binding 构造参数含义：
         * 1. 队列
         * 2. 交换机
         * 3. 路由键
         */
        return BindingBuilder
                .bind(queue())
                .to(exchange())
                .with(ROUTING_KEY)
                .noargs();
    }
}